package cadastro;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.GregorianCalendar;

import utilitarios.LtpUtil;
import dados.*;
import erros.SisComException;

public class Comercial 
{	
	private static ArrayList<Pessoa> pessoas = new ArrayList<>();
	private static ArrayList<Produto> produtos = new ArrayList<>();
	private static ArrayList<Compra> compras = new ArrayList<>();
	private static ArrayList<Venda> vendas = new ArrayList<>();
	
		
	public static class estatisticaVendMesAno
	{
		
		public int codigo;
		public String nome;
		public double meta;
		public double total;
		public double saldo;
	
		
		public estatisticaVendMesAno(int codigo, String nome, double meta, double total,
		double saldo) {
		this.codigo = codigo;
		this.nome = nome;
		this.meta = meta;
		this.total = total;
		this.saldo = saldo;
	}
	
	
	public String toString()
	{
		return
		"C�digo: " + codigo + "\n" +
		"Nome: " + nome + "\n" +
		"Meta mensal: " + meta + "\n" +
		"Total das vendas: " + total + "\n" +
		"Saldo: " + saldo + "\n\n";
	}	
	}
	
	
	public static ArrayList<estatisticaVendMesAno> estVendasVendMesAno (int mes, int ano) throws SisComException
	{
	boolean encontrou;
	double valor = 0;
	ArrayList<estatisticaVendMesAno> lista = new ArrayList<>();
	
	if(vendas.isEmpty())
	throw new SisComException("Lista de vendas vazia.");
	else
	{	
	for(Venda obj: vendas)
	{	
	if(obj.getDataVenda().get(GregorianCalendar.YEAR) == ano && obj.getDataVenda().get(GregorianCalendar.MONTH) == (mes-1))
	{
	encontrou = false;
	for(estatisticaVendMesAno obj2: lista)
	if(obj.getVendedor().getCodigo() == obj2.codigo)
	{
	encontrou = true;
	for(ItemVenda obj3: obj.getVendaItens())
	obj2.total += (obj3.getQuantVenda()*obj3.getValorVenda());
	obj2.saldo = obj2.total - obj2.meta;
	}
	
	if(!encontrou)
	{
	for(ItemVenda obj3: obj.getVendaItens())
	valor += obj3.getValorVenda()*obj3.getQuantVenda();
	double saldo =  (valor - obj.getVendedor().getMetaMensal());
	int codigo = obj.getVendedor().getCodigo();
	lista.add(new estatisticaVendMesAno(codigo, obj.getVendedor().getNome(), obj.getVendedor().getMetaMensal(), valor, saldo));
	valor = 0;
	}
	}
	}
	
	
	if(lista.isEmpty())
	throw new SisComException("Sem vendas no per�odo.");
	else
	{	
	Collections.sort(lista, new Comparator<estatisticaVendMesAno>() 
	{
	@Override
	public int compare(estatisticaVendMesAno o1, estatisticaVendMesAno o2) 
	{
	if(o1.total > o2.total) return 1;
	if(o1.total < o2.total) return -1;
	return 0;
	}
	});
	return lista;
	}
	}	
	}
		
		/**
	 * M�todo para inserir nova Pessoa.
	 * @param pessoa
	 * @throws SisComException - CPF j� cadastrado/CNPJ j� cadastrado
	 */
	public static void inserePessoa (Pessoa pessoa) throws SisComException
	{
		if (pessoa.tipoPessoa()==Pessoa.CLIENTE)
		{
			for (Pessoa obj:pessoas)
				if (obj.tipoPessoa()==Pessoa.CLIENTE)
					if (((Cliente)obj).getCpf().equals(((Cliente)pessoa).getCpf()))
					throw new SisComException("CPF j� cadastrado");
			pessoas.add(pessoa);
		}
		else if (pessoa.tipoPessoa()==Pessoa.VENDEDOR)
		{
			for (Pessoa obj:pessoas)
				if (obj.tipoPessoa()==Pessoa.VENDEDOR)
					if (((Vendedor)obj).getCpf().equals(((Vendedor)pessoa).getCpf()))
					throw new SisComException("CPF j� cadastrado");
			pessoas.add(pessoa);
		}
		else if (pessoa.tipoPessoa()==Pessoa.FORNECEDOR)
		{
			for (Pessoa obj:pessoas)
				if (obj.tipoPessoa()==Pessoa.FORNECEDOR)
					if (((Fornecedor)obj).getCnpj().equals(((Fornecedor)pessoa).getCnpj()))
					throw new SisComException("CNPJ j� cadastrado");
			pessoas.add(pessoa);
		}
	}
	/**
	 * M�todo para excluir uma Pessoa.
	 * @param pessoa
	 * @throws SisComException - Existe venda registrada para este cliente, n�o � possivel excluir! / Existe venda registrada para este vendedor, n�o � possivel excluir! / Existe compra registrada para este fornecedor, n�o � possivel excluir!
	 */
	public static void excluiPessoa (Pessoa pessoa) throws SisComException
	{
		if (pessoa.tipoPessoa()==Pessoa.CLIENTE)
		{
			for (Venda obj:vendas)
				if ((obj).getCliente().getCpf().equals(((Cliente)pessoa).getCpf()))
					throw new SisComException("Existe venda registrada para este cliente, n�o � possivel excluir!");
			pessoas.remove(pessoa);
		}
		else if (pessoa.tipoPessoa()==Pessoa.VENDEDOR)
		{
			for (Venda obj:vendas)
				if ((obj).getVendedor().getCpf().equals(((Vendedor)pessoa).getCpf()))
					throw new SisComException("Existe venda registrada para este vendedor, n�o � possivel excluir!");
			pessoas.remove(pessoa);
		}
		else if (pessoa.tipoPessoa()==Pessoa.FORNECEDOR)
		{
			for (Compra obj:compras)
				if ((obj).getFornecedor().getCnpj().equals(((Fornecedor)pessoa).getCnpj()))
					throw new SisComException("Existe compra registrada para este fornecedor, n�o � possivel excluir!");
			pessoas.remove(pessoa);
		}
	}
	/**
	 * M�todo para fazer uma compra para um fornecedor.
	 * @param fornecedor
	 * @param itens
	 * @throws SisComException - Produtos repetidos!
	 */
	public static void compraFornecedor (Fornecedor fornecedor, ArrayList<ItemCompra> itens) throws SisComException
	{
		int cont=0, cod=0;
		for (ItemCompra obj: itens){
			for (ItemCompra obj1: itens)
				if (obj1.getProduto().getCodigo()==obj.getProduto().getCodigo())
					cont++;
				if (cont >1)
					throw new SisComException("Produtos repetidos!");
		}
		for (ItemCompra obj: itens)
			obj.getProduto().addProduto(obj.getQuantCompra());
		
		if (compras.isEmpty())
			cod=1;
		else/**
			 * Classe de manipula��o dos objetos.
			 * @author 1A223114278 - Luiz Manoel Maia de Oliveira
			 * V1.0 - 11/11/2013
			 */
		cod = vendas.get(vendas.size()-1).getNumVenda()+1;
		
	compras.add(new Compra(cod,fornecedor,itens,new GregorianCalendar()));
		
	}
	/**
	 * M�todo para pesquisar uma compra.
	 * @param numerocompra
	 * @return - Compra do n�mero fornecido ou null
	 */
	public static Compra pesqCompra (int numerocompra)
	{
		for (Compra obj: compras)
			if(obj.getNumCompra() == numerocompra)
				return obj;
		
		return null;
	}
	/**
	 * M�todo para excluir uma compra de um fornecedor.
	 * @param numCompra
	 * @throws SisComException - N�o existe compra registrada com esse n�mero!
	 */
	public static void excluiCompra (int numCompra) throws SisComException
	{
	
		Compra aux = pesqCompra(numCompra);
		
		if (aux == null)
			throw new SisComException("N�o existe compra registrada com esse n�mero!");
		else
		
			for (ItemCompra obj1: aux.getCompraItens())
				try
				{
					obj1.getProduto().decProduto(obj1.getQuantCompra());
				}
				catch (SisComException e)
				{
					throw new SisComException(e.getMessage());
				}	
		compras.remove(aux);
	}
	/**
	 * M�todo para fazer uma venda para um cliente.
	 * @param cliente
	 * @param vendedor
	 * @param itens
	 * @throws SisComException - Produtos repetidos! / Limite de cr�dito insuficiente!
	 */
	public static void vendaCliente (Cliente cliente, Vendedor vendedor, ArrayList<ItemVenda> itens ) throws SisComException
	{
	
		float soma =0;
		int cont=0;
		int cod = 0;
		
		for (ItemVenda obj: itens){
			for (ItemVenda obj1: itens)
				if (obj1.getProduto().getCodigo()==obj.getProduto().getCodigo())
					cont++;
				if (cont >1)
					throw new SisComException("Produtos repetidos!");
		}
		
		for (ItemVenda obj: itens)
			soma = (float)(soma + obj.getQuantVenda() * obj.getValorVenda());
		if (soma > cliente.getLimiteCredito())
			throw new SisComException("Limite de cr�dito insuficiente!");
		
		for (ItemVenda obj: itens)
			obj.getProduto().decProduto(obj.getQuantVenda());
		
		if (vendas.isEmpty())
			cod = 1;
		else
			cod = vendas.get(vendas.size()-1).getNumVenda()+1;
		
		vendas.add(new Venda (cod, cliente,vendedor,itens, new GregorianCalendar()));
	}
	/**
	 * M�todo para pesquisar uma venda.
	 * @param numerovenda
	 * @return - Venda do n�mero fornecido ou null
	 */
	public static Venda pesqVenda (int numerovenda)
	{
		for (Venda obj: vendas)
			if(obj.getNumVenda() == numerovenda)
				return obj;
		
		return null;
	}
	/**
	 * M�todo para excluir uma venda de um cliente.	
	 * @param numVenda
	 * @throws SisComException - N�o existe venda registrada com esse n�mero!
	 */
	public static void excluiVenda (int numVenda) throws SisComException
	{
		Venda aux = pesqVenda (numVenda);
		
		if (aux == null)
			throw new SisComException("N�o existe venda registrada com esse n�mero!");
		else		
			for (ItemVenda obj1: aux.getVendaItens())
				obj1.getProduto().addProduto(obj1.getQuantVenda());
				
		vendas.remove(aux);
	}
	/**
	 * M�todo para inserir um novo produto.
	 * @param produto
	 */
	public static void insereProduto (Produto produto)
	{
		produtos.add(produto);
	}
	/**
	 * M�todo para excluir um produto.
	 * @param codProduto
	 * @throws SisComException - Existe venda registrada para este produto! / Existe compra registrada para este produto!
	 */
	public static void excluiProduto (int codProduto) throws SisComException
	{
		for (Venda obj: vendas)
			for (ItemVenda obj1: obj.getVendaItens())
				if (obj1.getProduto().getCodigo() == codProduto)
					throw new SisComException("Existe venda registrada para este produto!");
		
		for (Compra obj: compras)
			for (ItemCompra obj1: obj.getCompraItens())
				if (obj1.getProduto().getCodigo() == codProduto)
					throw new SisComException("Existe compra registrada para este produto!");
		
		for (Produto obj: produtos)
			if (obj.getCodigo() == codProduto)
			{
				produtos.remove(obj);
				break;
			}	
	}
	/**
	 * M�todo para pesquisar um cliente.
	 * @param cpf
	 * @return Clientes que contem o CPF informado
	 * @throws SisComException - N�o existe cliente cadastrado com esse CPF!
	 */
	public static Cliente pesqCliente (String cpf) throws SisComException
	{
		for (Pessoa obj: pessoas)
			if (obj.tipoPessoa() == Pessoa.CLIENTE)
				if(((Cliente)obj).getCpf().equals(cpf))
					return (Cliente)obj;
		throw new SisComException("N�o existe cliente cadastrado com esse CPF!");
	}
	/**
	 * M�todo para obter lista de clientes em ordem alfab�tica por parte do nome do cliente.
	 * @param nomeCliente
	 * @return Lista em ordem alfab�tica dos clientes encontrados
	 * @throws SisComException - N�o existe cliente cadastrado com este nome!
	 */
	public static ArrayList<Cliente> listaClientes (String nomeCliente) throws SisComException
	{
		ArrayList<Cliente> lista = new ArrayList<>();
		
		for(Pessoa obj: pessoas)
			if(obj.tipoPessoa() == Pessoa.CLIENTE)
				if(obj.getNome().contains(nomeCliente))
					lista.add((Cliente)obj);
		
		if(lista.isEmpty())
			throw new SisComException("N�o existe cliente cadastrado com este nome!");
		else
		{
			Collections.sort(lista);
			return lista;
		}
	}
	/**
	 * M�todo para buscar fornecedor por CNPJ.
	 * @param cnpj
	 * @return Fornecedor com o CNPJ informado
	 * @throws SisComException - N�o existe Fornecedor cadastrado com esse CNPJ!
	 */
	public static Fornecedor pesqFornecedor (String cnpj) throws SisComException
		{
			for (Pessoa obj: pessoas)
				if(obj.tipoPessoa() == Pessoa.FORNECEDOR)
					if(((Fornecedor)obj).getCnpj().equals(cnpj))
						return (Fornecedor)obj;
			throw new SisComException("N�o existe Fornecedor cadastrado com esse CNPJ!");
		}
	/**
	 * M�todo para obter lista de fornecedores em ordem alfab�tica por parte do nome do fornecedor.			
	 * @param nomeFornecedor
	 * @return Lista em ordem alfab�tica dos fornecedores encontrados
	 * @throws SisComException - N�o existe Fornecedor cadastrado com este nome!
	 */
	public static ArrayList<Fornecedor> listaFornecedor (String nomeFornecedor) throws SisComException
		{
			ArrayList<Fornecedor> lista = new ArrayList<>();
			
			for(Pessoa obj: pessoas)
				if(obj.tipoPessoa() == Pessoa.FORNECEDOR)
					if(obj.getNome().contains(nomeFornecedor))
						lista.add((Fornecedor)obj);
			
			if(lista.isEmpty())
				throw new SisComException("N�o existe Fornecedor cadastrado com este nome!");
			else
			{
				Collections.sort(lista);
				return lista;
			}
		}
	/**
	 * M�todo para buscar vendedor por cpf.
	 * @param cpf
	 * @return
	 * @throws SisComException - N�o existe Vendedor cadastrado com esse CPF!
	 */
	public static Vendedor pesqVendedor (String cpf) throws SisComException
		{
			for (Pessoa obj: pessoas)
				if (obj.tipoPessoa() == Pessoa.VENDEDOR)
					if(((Vendedor)obj).getCpf().equals(cpf))
						return (Vendedor)obj;
			throw new SisComException("N�o existe Vendedor cadastrado com esse CPF!");
		}
	/**
	 * M�todo para obter lista de vendedores em ordem alfab�tica por parte do nome do vendedor.	
	 * @param nomeVendedor
	 * @return Lista em ordem alfab�tica dos vendedores encontrados
	 * @throws SisComException - N�o existe Vendedor cadastrado com este nome!
	 */
	public static ArrayList<Vendedor> listaVendedor (String nomeVendedor) throws SisComException
		{
			ArrayList<Vendedor> lista = new ArrayList<>();
			
			for(Pessoa obj: pessoas)
				if(obj.tipoPessoa() == Pessoa.VENDEDOR)
					if(obj.getNome().contains(nomeVendedor))
						lista.add((Vendedor)obj);
			
			if(lista.isEmpty())
				throw new SisComException("N�o existe Vendedor cadastrado com este nome!");
			else
			{
				Collections.sort(lista);
				return lista;
			}
		}
	/**
	 * M�todo para buscar produto por c�digo.
	 * @param cod
	 * @return Produto pesquisado
	 * @throws SisComException - N�o existe Produto cadastrado com esse C�digo!
	 */
	public static Produto pesqProduto (int cod) throws SisComException
		{
			for (Produto obj: produtos)
				if(obj.getCodigo() == cod)
					return obj;
			throw new SisComException("N�o existe Produto cadastrado com esse C�digo!");
		}
	/**
	 * M�todo para obter lista de produtos em ordem alfab�tica por parte do nome do produto.
	 * @param nomeProduto
	 * @return Lista em ordem alfab�tica dos produtos
	 * @throws SisComException - N�o existe Produto cadastrado com este nome!
	 */
	public static ArrayList<Produto> listaProduto (String nomeProduto) throws SisComException
		{
			ArrayList<Produto> lista = new ArrayList<>();
			
			for(Produto obj: produtos)
				if(obj.getNome().equals(nomeProduto))
					lista.add(obj);
			
			if(lista.isEmpty())
				throw new SisComException("N�o existe Produto cadastrado com este nome!");
			else
			{
				Collections.sort(lista);
				return lista;
			}
		}
	/**
	 * M�todo para obter lista de produtos com estoque abaixo do m�nimo em ordem alfab�tica.	- M�TODO RETIRADO PELO PROF. �RIX -
	 * @param minProduto
	 * @return Lista com os produtos abaixo do m�nimo informado pelo usu�rio
	 * @throws SisComException - N�o existe Produto cadastrado com estoque menor que o informado!
	 */
	public static ArrayList<Produto> listaProdutoMin (int minProduto) throws SisComException
		{
			ArrayList<Produto> lista = new ArrayList<>();
			
			for(Produto obj: produtos)
				if(obj.getEstoque() < minProduto)
					lista.add(obj);
			
			if(lista.isEmpty())
				throw new SisComException("N�o existe Produto cadastrado com estoque menor que o informado!");
			else
			{
				Collections.sort(lista);
				return lista;
			}
		}
	/**
	 * M�todo para obter lista de vendas em ordem de cliente e data da venda decrescente. Par�metro: parte do nome do cliente e per�odo das vendas.
	 * @param nome
	 * @param dataInicial
	 * @param dataFinal
	 * @return Lista de vendas por cliente e per�odo informado em ordem decrescente
	 * @throws SisComException - N�o existe Venda para este Cliente no per�odo informado!
	 */
	public static ArrayList<Venda> listaVenda01 (String nome, GregorianCalendar dataInicial, GregorianCalendar dataFinal) throws SisComException
		{
			ArrayList<Venda> lista = new ArrayList<>();
			
			for (Venda obj: vendas)
				if(obj.getCliente().getNome().contains(nome))
					if (obj.getDataVenda().after(dataInicial) && obj.getDataVenda().before(dataFinal) || obj.getDataVenda().equals(dataInicial) || obj.getDataVenda().equals(dataFinal))
						lista.add(obj);
			if (lista.isEmpty())
				throw new SisComException("N�o existe Venda para este Cliente no per�odo informado!");
			else
			{
				Collections.sort(lista,new Comparator<Venda>()
				{

					@Override
					public int compare(Venda o1, Venda o2) 
					{
						int comp = o1.getCliente().compareTo(o2.getCliente());
								if(comp !=0)
									return comp;
								else
									return (o1.getDataVenda().compareTo(o2.getDataVenda())) *-1;
					}
				});
				return lista;
			}				
		}
	/**
	 * M�todo para obter lista de vendas em ordem de vendedor e data da venda decrescente.
	 * @param nome
	 * @param dataInicial
	 * @param dataFinal
	 * @return Lista de vendas por vendedor e per�odo informado em ordem decrescente
	 * @throws SisComException - N�o existe Venda para este Vendedor no per�odo informado!
	 */
	public static ArrayList<Venda> listaVenda02 (String nome, GregorianCalendar dataInicial, GregorianCalendar dataFinal) throws SisComException
		{
			ArrayList<Venda> lista = new ArrayList<>();
			
			for (Venda obj: vendas)
				if(obj.getVendedor().getNome().contains(nome))
					if (obj.getDataVenda().after(dataInicial) && obj.getDataVenda().before(dataFinal) || obj.getDataVenda().equals(dataInicial) || obj.getDataVenda().equals(dataFinal))
						lista.add(obj);
			if (lista.isEmpty())
				throw new SisComException("N�o existe Venda para este Vendedor no per�odo informado!");
			else
			{
				Collections.sort(lista,new Comparator<Venda>()
				{

					@Override
					public int compare(Venda o1, Venda o2) 
					{
						int comp = o1.getVendedor().compareTo(o2.getVendedor());
								if(comp !=0)
									return comp;
								else
									return (o1.getDataVenda().compareTo(o2.getDataVenda())) *-1;
					}
				});
				return lista;
			}				
		}
	/**
	 * M�todo para obter lista de compras em ordem de fornecedor e data da compra decrescente.
	 * @param nome
	 * @param dataInicial
	 * @param dataFinal
	 * @return Lista de compras por vendedor e per�odo informado em ordem decrescente
	 * @throws SisComException - N�o existe Venda para este Vendedor no per�odo informado!
	 */
	public static ArrayList<Compra> listaCompra01 (String nome, GregorianCalendar dataInicial, GregorianCalendar dataFinal) throws SisComException
		{
			ArrayList<Compra> lista = new ArrayList<>();
			
			for (Compra obj: compras)
				if(obj.getFornecedor().getNome().contains(nome))
					if (obj.getDataCompra().after(dataInicial) && obj.getDataCompra().before(dataFinal) || obj.getDataCompra().equals(dataInicial) || obj.getDataCompra().equals(dataFinal))
						lista.add(obj);
			if (lista.isEmpty())
				throw new SisComException("N�o existe Venda para este Vendedor no per�odo informado!");
			else
			{
				Collections.sort(lista,new Comparator<Compra>()
				{
					@Override
					public int compare(Compra o1, Compra o2) 
					{
						int comp = o1.getFornecedor().compareTo(o2.getFornecedor());
								if(comp !=0)
									return comp;
								else
									return (o1.getDataCompra().compareTo(o2.getDataCompra())) *-1;
					}
				});
				return lista;
			}				
		}
	/**
	 * M�todo para buscar Estat�stica de Vendas por cliente (Nome, quantas vezes comprou e valor total).
	 * @author 1A223114278 - Luiz Manoel Maia de Oliveira
	 * V1.0 - 11/11/2013
	 */
	public static class estCli
		{
			public String nome;
			public int qtde;
			public float valor;
			public int cod;
		}
	/**
	 * M�todo para buscar Estat�stica de Vendas por vendedor (Nome, quantas vezes vendeu e valor total).
	 * @author 1A223114278 - Luiz Manoel Maia de Oliveira
	 * V1.0 - 11/11/2013
	 */
	public static class estVen
		{
		public String nome;
		public int qtde;
		public float valor;
		public int cod;
		}
	/**
	 * M�todo para buscar Estat�stica de Compras por fornecedor (Nome, quantas vezes vendeu e valor total).
	 * @author 1A223114278 - Luiz Manoel Maia de Oliveira
	 * V1.0 - 11/11/2013
	 */
	public static class estFor
		{
		public String nome;
		public int qtde;
		public float valor;
		public int cod;
		}
	/**
	 * M�todo para buscar Estat�stica de Vendas por cliente (Nome, quantas vezes comprou e valor total).
	 * @param dataInicial
	 * @param dataFinal
	 * @return Lista de estat�stica por cliente
	 */
	public static ArrayList<estCli> estatisticaCliente (GregorianCalendar dataInicial, GregorianCalendar dataFinal) throws SisComException
	{
		ArrayList<estCli> lista = new ArrayList<>();
		boolean encontrou = false;
		
		for (Venda obj: vendas)
			if (obj.getDataVenda().after(dataInicial) && obj.getDataVenda().before(dataFinal) || obj.getDataVenda().equals(dataInicial) || obj.getDataVenda().equals(dataFinal))
			{
				encontrou = false;
				for(estCli obj1: lista)
					if(obj1.cod == obj.getCliente().getCodigo())
					{
						encontrou = true;
						obj1.qtde++;
						for(ItemVenda obj2: obj.getVendaItens())
							obj1.valor = obj1.valor + (float)(obj2.getQuantVenda() * obj2.getValorVenda());
					}
				if (!encontrou)
				{
					estCli estatistica = new estCli();
					estatistica.cod = obj.getCliente().getCodigo();
					estatistica.qtde = 1;
					estatistica.nome = obj.getCliente().getNome();
					for(ItemVenda obj2: obj.getVendaItens())
						estatistica.valor = estatistica.valor + (float)(obj2.getQuantVenda() * obj2.getValorVenda());
					
					lista.add(estatistica);
				}
			}
		
		if(lista.isEmpty())
			throw new SisComException("N�o existem vendas nesse per�odo!");
		
		return lista;					
	}
	/**
	 * M�todo para buscar Estat�stica de Vendas por vendedor (Nome, quantas vezes vendeu e valor total).
	 * @param dataInicial
	 * @param dataFinal
	 * @return Lista de estat�stica por vendedor
	 */
	public static ArrayList<estVen> estatisticaVendedor (GregorianCalendar dataInicial, GregorianCalendar dataFinal) throws SisComException
	{
		ArrayList<estVen> lista = new ArrayList<>();
		boolean encontrou = false;
		
		for (Venda obj: vendas)
			if (obj.getDataVenda().after(dataInicial) && obj.getDataVenda().before(dataFinal) || obj.getDataVenda().equals(dataInicial) || obj.getDataVenda().equals(dataFinal))
			{
				encontrou = false;
				for(estVen obj1: lista)
					if(obj1.cod == obj.getVendedor().getCodigo())
					{
						encontrou = true;
						obj1.qtde++;
						for(ItemVenda obj2: obj.getVendaItens())
							obj1.valor = obj1.valor + (float)(obj2.getQuantVenda() * obj2.getValorVenda());
					}
				if (!encontrou)
				{
					estVen estatistica = new estVen();
					estatistica.cod = obj.getVendedor().getCodigo();
					estatistica.qtde = 1;
					estatistica.nome = obj.getVendedor().getNome();
					for(ItemVenda obj2: obj.getVendaItens())
						estatistica.valor = estatistica.valor + (float)(obj2.getQuantVenda() * obj2.getValorVenda());
					
					lista.add(estatistica);
				}
			}
		
		if(lista.isEmpty())
			throw new SisComException("N�o existem vendas nesse per�odo!");
		
		return lista;					
	}	
	/**
	 * M�todo para buscar Estat�stica de Compras por fornecedor (Nome, quantas vezes vendeu e valor total).
	 * @param dataInicial
	 * @param dataFinal
	 * @return Lista de estat�stica por fornecedor
	 */
	public static ArrayList<estFor> estatisticaFornecedor (GregorianCalendar dataInicial, GregorianCalendar dataFinal) throws SisComException
	{
		ArrayList<estFor> lista = new ArrayList<>();
		boolean encontrou = false;
		
		for (Compra obj: compras)
			if (obj.getDataCompra().after(dataInicial) && obj.getDataCompra().before(dataFinal) || obj.getDataCompra().equals(dataInicial) || obj.getDataCompra().equals(dataFinal))
			{
				encontrou = false;
				for(estFor obj1: lista)
					if(obj1.cod == obj.getFornecedor().getCodigo())
					{
						encontrou = true;
						obj1.qtde++;
						for(ItemCompra obj2: obj.getCompraItens())
							obj1.valor = obj1.valor + (float)(obj2.getQuantCompra() * obj2.getValorCompra());
					}
				if (!encontrou)
				{
					estFor estatistica = new estFor();
					estatistica.cod = obj.getFornecedor().getCodigo();
					estatistica.qtde = 1;
					estatistica.nome = obj.getFornecedor().getNome();
					for(ItemCompra obj2: obj.getCompraItens())
						estatistica.valor = estatistica.valor + (float)(obj2.getQuantCompra() * obj2.getValorCompra());
					
					lista.add(estatistica);
				}
			}
		
		if(lista.isEmpty())
			throw new SisComException("N�o existem compras nesse per�odo!");
		
		return lista;					
	}	
	/**
	 * M�todo para buscar o c�digo da �ltima pessoa cadastrada.
	 * @return N�mero do c�digo da pr�ximo pessoa a ser cadastrada
	 */
	public static int codPessoa() 
	{
		int cod;
		
		if (pessoas.isEmpty())
			cod=1;
		else
			cod=pessoas.get(pessoas.size()-1).getCodigo()+1;
		
		return cod;		
	}
	/**
	 * M�todo para buscar o c�digo do �ltimo produto cadastrado.
	 * @return N�mero do c�digo do pr�ximo produto a ser cadastrado
	 */
	public static int codProduto() 
	{
		int cod;
		
		if (produtos.isEmpty())
			cod=1;
		else
			cod=produtos.get(produtos.size()-1).getCodigo()+1;
		
		return cod;		
	}
	/**
	 * L� os dados do arquivo.
	 */
	@SuppressWarnings("unchecked")
	public static void leitura() throws SisComException
	{
		File objFile = new File("Pessoas.amanda");
		File objFile1 = new File("Produtos.amanda");
		File objFile2 = new File("Compras.amanda");
		File objFile3 = new File("Vendas.amanda");
		
		if (objFile.exists()) 
		{
		  try 
		  {
			  pessoas = LtpUtil.lerArquivoObjetosArray("Pessoas.luiz");
		  }
		  catch (Exception e)
		  {
			  throw new SisComException(e.getMessage());
		  }	
		}
		
		if (objFile1.exists()) 
		{
		  try 
		  {
			  produtos = LtpUtil.lerArquivoObjetosArray("Produtos.luiz");
		  }
		  catch (Exception e)
		  {
			  throw new SisComException(e.getMessage());
		  }	
		}
		
		if (objFile2.exists()) 
		{
		  try 
		  {
			  compras = LtpUtil.lerArquivoObjetosArray("Compras.luiz");
		  }
		  catch (Exception e)
		  {
			  throw new SisComException(e.getMessage());
		  }	
		}
		
		if (objFile3.exists()) 
		{
		  try 
		  {
			  vendas = LtpUtil.lerArquivoObjetosArray("Vendas.luiz");
		  }
		  catch (Exception e)
		  {
			  throw new SisComException(e.getMessage());
		  }	
		}		
	}
	/**
	 * Grava os dados no arquivo.
	 */
	public static void gravacao() throws SisComException
	{
		try 
		{
			LtpUtil.gravarArquivoObjetosArray("Pessoas.amanda", pessoas);
			LtpUtil.gravarArquivoObjetosArray("Produtos.amanda", produtos);
			LtpUtil.gravarArquivoObjetosArray("Compras.amanda", compras);
			LtpUtil.gravarArquivoObjetosArray("Vendas.amanda", vendas);
		}
		catch (Exception e) 
		{
			throw new SisComException(e.getMessage());
		}		
	}
	
}
